package com.unipay.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.unipay.model.system.SysMenu;
import com.unipay.model.system.SysRoleMenu;
import com.unipay.model.vo.AssginMenuVo;
import com.unipay.model.vo.RouterVo;
import com.unipay.system.handler.UnipayException;
import com.unipay.system.mapper.SysMenuMapper;
import com.unipay.system.mapper.SysRoleMenuMapper;
import com.unipay.system.service.SysMenuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.unipay.system.utils.MenuHelper;
import com.unipay.system.utils.RouterHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 菜单表 服务实现类
 * </p>
 *
 * @author cmy
 * @since 2023-02-08
 */
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {

    @Override
    public List<SysMenu> findNodes() {
        //（1）全部权限列表
        List<SysMenu> sysMenus = baseMapper.selectList(null);
        if(CollectionUtils.isEmpty(sysMenus)) return null;
        //（2）构建树形数据
        List<SysMenu> result = MenuHelper.buildTree(sysMenus);
        return result;
    }

    @Autowired
    private SysMenuMapper sysMenuMapper;
    @Override
    public int removeSubById(Long id) {
        //TODO ？？？
        QueryWrapper<SysMenu> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", id);
//        int delete = sysMenuMapper.delete(queryWrapper);
//        return delete;
        Integer count = baseMapper.selectCount(queryWrapper);
        if (count > 0){
            // 有子菜单
            throw new UnipayException(201, "请先删除子菜单！！！");
        }
        // 调用删除
        int i = baseMapper.deleteById(id);
        return i;
    }



    @Autowired
    private SysRoleMenuMapper sysRoleMenuMapper;
    //（1）根据角色获取授权权限数据
    @Override
    public List<SysMenu> findSysMenuByRoleId(String roleId) {
        // 获取所有，status为1的权限列表
//        List<SysMenu> menuList = baseMapper.selectList(new QueryWrapper<SysMenu>().eq("status", 1));
        List<SysMenu> menuList = sysMenuMapper.selectList(new QueryWrapper<SysMenu>().eq("status", 1));
        // 根据角色id，获取角色权限（该角色，分配过的“菜单列表”）
        List<SysRoleMenu> roleMenus = sysRoleMenuMapper.selectList(new QueryWrapper<SysRoleMenu>().eq("role_id", roleId));
        // 遍历所有，权限列表（继续，获取角色所分配菜单的ID）
        ArrayList<String> roleMenuIds = new ArrayList<>();
        for(SysRoleMenu sysRoleMenu: roleMenus){
            roleMenuIds.add(sysRoleMenu.getMenuId());
        }
        // 数据处理：isSelect，如果菜单选择true，否则false
        // 拿菜单ID和所有菜单对比，有相同的，isSelect设为true
        for (SysMenu sysMenu: menuList){
            if (roleMenuIds.contains(sysMenu.getId())){
                sysMenu.setSelect(true);
            }else {
                sysMenu.setSelect(false);
            }
        }
        // 将权限列表转换为权限树，便于显示
        List<SysMenu> sysMenus = MenuHelper.buildTree(menuList);
        return sysMenus;
    }
    //（2）给角色分配权限
    @Override
    public void doAssign(AssginMenuVo assginMenuVo) {
        // 删除已分配的权限
        sysRoleMenuMapper.delete(new QueryWrapper<SysRoleMenu>().eq("role_id", assginMenuVo.getRoleId()));
        // 遍历所有已选择的权限id
        for (String menuId : assginMenuVo.getMenuIdList()){
            if (menuId != null){
                // 创建SysRoleMenu对象
                SysRoleMenu sysRoleMenu = new SysRoleMenu();
                sysRoleMenu.setRoleId(assginMenuVo.getRoleId());
                sysRoleMenu.setMenuId(menuId);
                // 重新，添加新权限
                sysRoleMenuMapper.insert(sysRoleMenu);      //TODO ---insert()---
            }
        }
    }

    //（1）根据用户id获取，菜单权限值
    @Override
    public List<RouterVo> findUserMenuList(String userId) {
        List<SysMenu> sysMenuList = null;
        // 超级管理员admin账号，userId为：1，可用拥有所有菜单权限
        if ("1".equals(userId)){
            QueryWrapper<SysMenu> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("status", 1);
            queryWrapper.orderByAsc("sort_value");
            sysMenuList = baseMapper.selectList(queryWrapper);
        }else {
            // 如果userId不是1：其他账户类型，查询这个用户的 菜单权限
            sysMenuList = sysMenuMapper.findListByUserId(userId);
        }
        // 构建，树形结构
        List<SysMenu> menuTreeList = MenuHelper.buildTree(sysMenuList);
        // TODO 转换成 “前端路由，要求的数据格式”
        List<RouterVo> routerVoList = RouterHelper.buildRouters(menuTreeList);
        return routerVoList;
    }
    //（2）根据用户id获取，用户按钮权限
    @Override
    public List<String> findUserPermsList(String userId) {
        List<SysMenu> sysMenuList = null;
        // 判断：是否是 admin
        if ("1".equals(userId)){
            sysMenuList = baseMapper.selectList(new QueryWrapper<SysMenu>().eq("status", 1));
        }else {
            sysMenuList = sysMenuMapper.findListByUserId(userId);
        }
        // sysMenuList遍历
        List<String> permissionList = new ArrayList<>();
        for (SysMenu sysMenu: sysMenuList){
            // ---按钮：type，权限：perms---
            if (sysMenu.getType() == 2){
                String perms = sysMenu.getPerms();
                permissionList.add(perms);
            }
        }
        return permissionList;
    }
}
